sh_remove_all_mappings() will walk roughly half of the shadow L1
tables for each MFN it's called with; calling it for every MFN in a
guest's framebuffer can be _very_ expensive, especially with the
shadow lock held across the whole operation. Avoid that by just
blowing away all the shadows.
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
* no need to be careful. */
if ( !dirty_vram )
{
- /* Just recount from start. */
- for ( i = begin_pfn; i < end_pfn; i++ ) {
- mfn_t mfn = gfn_to_mfn(d, i, &t);
- if (mfn_x(mfn) != INVALID_MFN)
- flush_tlb |= sh_remove_all_mappings(d->vcpu[0], mfn);
- }
+ /* Throw away all the shadows rather than walking through them
+ * up to nr times getting rid of mappings of each pfn */
+ shadow_blow_tables(d);
gdprintk(XENLOG_INFO, "tracking VRAM %lx - %lx\n", begin_pfn, end_pfn);